package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;

import com.itheima.constant.MessageConstant;
import com.itheima.dao.UserManageDao;
import com.itheima.entity.PageResult;

import com.itheima.pojo.Role;
import com.itheima.pojo.User;
import com.itheima.service.UserManageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户项服务接口实现类:
 */
@Service(interfaceClass = UserManageService.class)
@Transactional  //2.6.2高些版本事务没有问题 当前2.6.0存在问题
public class UserManageServiceImpl implements UserManageService {
    //
    @Autowired
    private UserManageDao userManageDao;
    //加密密码策列
    BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
    //id查询用户获取密码
    String tempPassword= null;
    /**
     * 查询所有角色数据
     */
    @Override
    public List<Role> findAll() {
        return userManageDao.findAll();
    }

    /**
     * 用户项分页查询
     */
    @Override
    public PageResult findPage(Integer currentPage, Integer pageSize, String queryString) {
        //第一步：设置分页参数
        PageHelper.startPage(currentPage,pageSize);
        //第二步：查询数据库（代码一定要紧跟设置分页代码  没有手动分页 select * from table where name = 'xx'  ）
        Page<User> userManagePage = userManageDao.selectByCondition(queryString);


        return new PageResult(userManagePage.getTotal(),userManagePage.getResult());
    }

    /**
     * 新增用户
     */
    @Override
    public void add(User userManage, Integer[] userManageIds) {
        //第一步：添加加密密码,保存用户到用户数据
        userManage.setPassword(encoder.encode(userManage.getPassword()));
        userManageDao.add(userManage);
        //第二步：获取用户id
        Integer manageId = userManage.getId();
        //第三步：往用户表角色表中间表 遍历插入关系数据
        setUserAndRole(manageId,userManageIds);
    }
/*
用户删除
 */
    @Override
    public void deleteById(Integer userManageId) {
        //1.根据用户id查询角色id中间表（count(*)）
        int count1 = userManageDao.findUserIdByRoleId(userManageId);
        if(count1>0){
            throw new RuntimeException(MessageConstant.DELETE_USERMANAGE_FAIL2);
        }

        //2.根据用户id删除用户记录
        userManageDao.deleteById(userManageId);
    }
    /**
     * 根据用户id查询用户
     */
    @Override
    public User findById(Integer userManageId) {

        User byId = userManageDao.findById(userManageId);
        //临时存储用户密码
        tempPassword=byId.getPassword();
        return byId;
    }

    /*
   根据用户id 查询角色中间表
   获取角色ids
    */
    @Override
    public List<Integer> findRoleIdsByUserManageId(Integer userManageId) {
        return userManageDao.findRoleIdsByUserManageId(userManageId);
    }

    /**
     * 编辑用户
     */
    @Override
    public void edit(User userManage, Integer[] userManageIds) {
        //1.先根据用户id从用户角色中间表 删除关系数据
          userManageDao.deleteRoleByUserById(userManage.getId());
        //2.根据页面传入的角色ids 和 角色重新建立关系
        setUserAndRole(userManage.getId(),userManageIds);
        //3. 添加加密密码，根据用户id 更新角色数据
        if("***".equals(userManage.getPassword())){
            userManage.setPassword(tempPassword);
        }else{
            userManage.setPassword(encoder.encode(userManage.getPassword()));
        }

        userManageDao.edit(userManage);
    }


    /*
    往用户和角色中间表插入数据
     */
    private void setUserAndRole(Integer manageId, Integer[] userManageIds) {
        if(userManageIds != null && userManageIds.length>0){
            for (Integer userManageId : userManageIds) {
                Map<String,Object> map = new HashMap<>();
                map.put("userManageId",userManageId);
                map.put("manageId",manageId);
                userManageDao.setUserAndRole(map);
            }
        }
    }


}
